/*
 * IndexadorRss.cpp
 *
 *  Created on: Apr 27, 2014
 *      Author: carlos
 */

#include "IndexadorRss.h"
#include "../EntityFactory.h"

IndexadorRss::IndexadorRss(HashExtensibleRss* hash,
		IStrutureBTreeImpl* indiceFechaAsc, IStrutureBTreeImpl* indiceFechaDesc,
		IStrutureBTreeImpl* indiceTitulo) {

	this->hash = hash;
	this->indiceTitulo = indiceTitulo;
	this->indiceFechaAsc = indiceFechaAsc;
	this->indiceFechaDesc = indiceFechaDesc;
}

void IndexadorRss::add(Rss* rss) {

	SimpleStringSecondaryindex* ssIndex =
			(SimpleStringSecondaryindex*) this->indiceTitulo->find(
					rss->getTitulo());
	if (ssIndex == NULL) {
		ssIndex = EntityFactory::createSimpleStringSecondaryIndex(TITULO_IDRSS);
		//cout<<"indexando.."<<rss->getTitulo()<<endl;
		ssIndex->setIdstring(rss->getTitulo());
		ssIndex->agregarIdOrdenado(rss->getId());
		this->indiceTitulo->insert(ssIndex);
	} else {
		ssIndex->agregarIdOrdenado(rss->getId());
		this->indiceTitulo->modify(ssIndex);
	}
	delete ssIndex;
}

void IndexadorRss::deleteRecord(int identificador) {

	Rss* rss = new Rss();
	rss->setId(identificador);
	Rss* rssRecoverd = this->hash->searchRss(rss);
	if (rssRecoverd != NULL) {
		this->hash->doHashingDelete(rssRecoverd);
		SimpleStringSecondaryindex* ssIndex =
				(SimpleStringSecondaryindex*) this->indiceTitulo->find(rssRecoverd->getTitulo());
		if (ssIndex != NULL) {
			ssIndex->removerIdRelacional(identificador);
			this->indiceTitulo->modify(ssIndex);
		} else {
			cout << "Error en la logica de indexacion. El id: " << identificador
					<< " deberia estar indexado por titulo: "<<rssRecoverd->getTitulo()<<endl;
		}
	} else {
		cout << "No se encontro el RSS por id" <<identificador<< endl;
	}

}

void IndexadorRss::deleteRecordFechaExacta(int aniomesdia) {
	//recupero los twits de la fecha y elimino los id de cada uno

	SimpleSecondaryIndex* ientidad =
			(SimpleSecondaryIndex*) this->indiceFechaAsc->find(
					StringUtils::intToString(aniomesdia));

	if (ientidad != NULL) {
		vector<ID> idsRelacionales = ientidad->getId_relacionales();

		vector<ID>::iterator itIdsRelacionales;
		Rss* rss = new Rss();
		for (vector<ID>::iterator it = idsRelacionales.begin();
				it != idsRelacionales.end(); it++) {
			int idAElminar = (*it);
			rss->setId(idAElminar);
			Rss* rssRecuperado = this->hash->searchRss(rss);
			this->hash->doHashingDelete(rss);
			//ahora hay que eliminar los id de autores. Por cada
			SimpleStringSecondaryindex* ssIndex =
					(SimpleStringSecondaryindex*) this->indiceTitulo->find(
							rss->getTitulo());
			if (ssIndex != NULL) {
				ssIndex->removerIdRelacional(rssRecuperado->getId());
			}
			delete rssRecuperado;
		}
		delete rss;
		this->indiceFechaAsc->remove(StringUtils::intToString(aniomesdia));
	} else {
		cout << "No existen rss para la fecha" << aniomesdia << endl;
	}
}

void IndexadorRss::exportar() {
	this->indiceTitulo->exportar();
}
IndexadorRss::~IndexadorRss() {
	//no hacer delete de los indices ni del hash
}

